package agh.rozproszony.reservations;

import View.InvitationRow;
import agh.rozproszony.model.Invitation;
import agh.rozproszony.model.Reservation;
import agh.rozproszony.model.Room;
import agh.rozproszony.model.User;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Interfejs RMI dla serwera rezerwacji
 */
public interface ReservationsServer extends Remote {

    /**
     * Pobiera liste wszsytkich pokoi w systemie
     *
     * @return
     * @throws RemoteException
     */
    public List<Room> getAllRooms() throws RemoteException;

    /**
     * Pobiera liste wszystkich uzytkownikow w systemie
     *
     * @return
     * @throws RemoteException
     */
    public List<User> getAllUsers() throws RemoteException;

    /**
     * Pobiera liste wszystkich rezerwacji w systemie
     *
     * @return
     * @throws RemoteException
     */
    public List<Reservation> getAllReservations() throws RemoteException;

    /**
     * Dodaje nowa rezerwacje w systemie (jezeli mozliwe). Przy sukcesie nadaje
     * ID przekazanej rezerwacji.
     *
     * @param reservation Rezerwacja do dodania
     * @return true jezeli udalo sie zarezerwowac
     * @throws RemoteException
     */
    public boolean addReservation(Reservation reservation) throws RemoteException;

    /**
     * Dodaje nowe zaproszenie do okreslonej rezerwacji.
     *
     * @param invitation
     * @throws RemoteException Jezeli dodanie zaproszenia sie nie powiedzie
     */
    public void addInvitation(Invitation invitation) throws RemoteException;

    /**
     * Sprawdza login i hasło
     *
     * @param login
     * @param password
     * @return true jeżeli identyczne
     * @throws RemoteException
     */
    public boolean validateLoginPasswordUser(String login, char[] password) throws RemoteException;

    /**
     * Zwraca użytkownika
     *
     * @param login
     * @return User
     * @throws RemoteException
     */
    public User getUserByLogin(String login) throws RemoteException;

    public void addReservationEventListener(ReservationEventListener listener) throws RemoteException;

    public void removeReservationEventListener(ReservationEventListener listener) throws RemoteException;

    public List<Invitation> getAwaitingInvitations(int userId) throws RemoteException;

    /**
     * Zwraca użytkownika
     *
     * @param login
     * @return User
     * @throws RemoteException
     */
    public User getUserByEmail(String email) throws RemoteException, SQLException;

    /*
     * Zwraca nazwe pokoju który została zarezerowany
     * @param id
     * @return String
     */
    public String getReservationRoomName(int id) throws RemoteException, SQLException;

    /*
     * Zwraca nazwe użytkownika który dokonał rezerwacji pokoju
     * @param id
     * @return String
     */
    public String getReservationOwnerLogin(int id) throws RemoteException, SQLException;

    /*
     * Zwraca liste rezerwacji z przedziału dat od do
     * @param from
     * @param to
     * @return List<Reservation>
     */
    public List<Reservation> getAllReservations(Date from, Date to) throws RemoteException;

    /*
     * Zwraca liste rezerwacji z przedziału dat od do
     * @param from
     * @param to
     * @param roomId
     * @return List<Reservation>
     */
    public List<Reservation> getAllReservations(Date from, Date to, int roomId) throws RemoteException;

    /**
     * Usuwa podanego uzytkownika
     *
     * @param user
     * @throws RemoteException
     */
    public void deleteUser(User user) throws RemoteException;

    /**
     * Usuwa podana rezerwacje
     *
     * @param reservation
     * @throws RemoteException
     */
    public void deleteReservation(Reservation reservation) throws RemoteException;

    /**
     * Dodaje nowego uzytkownika
     *
     * @param user
     * @throws RemoteException
     */
    public void insertUser(User user) throws RemoteException;

    /**
     * Dodaje nowe pomieszczenie
     *
     * @param room
     * @throws RemoteException
     */
    public void insertRoom(Room room) throws RemoteException;

    /**
     * Usuwa podane pomieszczenie
     *
     * @param room
     * @throws RemoteException
     */
    public void deleteRoom(Room room) throws RemoteException;

    /*
     * Zwraca Id rezerwacji z bazy danych
     * @param reservation
     * @return id
     */
    public int getReservationId(Reservation reservation) throws RemoteException;
    
    /**
     *
     * @param id
     * @return
     * @throws RemoteException
     */
    public Reservation getReservation(int id) throws RemoteException;
    
    public User getUserNameById(int id) throws RemoteException;

    public int deleteInvitation(InvitationRow removeUnselectedRows) throws RemoteException;
    
    public void setInvitationAccepted( int userId , int reservationId ) throws RemoteException;
    
    
    
    
}
